208. 架設sftp
事由
需要一個地方放大量的資料,日後提供給客戶下載,
本來想說用GCS就好,但如果要一次下載好幾個檔案就沒辦法了。
只好乖乖弄FTP。
正文
一開始用vsftp,搞個docker 大概沒10分鐘就好了。
有一半的時間在找image上面,
但如果要達成『一個使用者,可以看到所有使用者的目錄,其他使用者需要獨立』就懵了。
後續找資料時,看到鳥哥說了一句話,『所以,建議您,除非必要,否則的話,使用 SSH 提供的 sftp-server 功能即可』
ref. FTP 的安全性問題與替代方案
所以我就轉往sftp了。
先來釐清目標,
一個最高權限的帳號,
可以在所有使用者的目錄新增檔案,
然後所有使用者間是不能互相看到彼此的檔案。
docker image 使用 corilus/sftp,
下載量已達1M。
如果只是簡單的ftp功能,直接架起來就好了。
但要做成上面的目標,要用mount的方式,將資料夾掛載到主目錄底下。
詳細作法參考下面。
docker-compose.yaml
version: '3'
services:
sftp:
container_name: sftp
image: corilus/sftp
privileged: true
volumes:
- ./mount.sh:/etc/sftp.d/bindmount.sh
- ./userlist.conf:/etc/sftp/users.conf:ro
- ./upload:/home
ports:
- "2222:22"
restart: always
指令說明,可參考 108. linux shell 進階指令#^bdeaee
mount.sh
#!/bin/bash
# File mounted as: /etc/sftp.d/bindmount.sh
# Just an example (make your own)
function bindmount() {
if [[ ! -d "$1" ]]; then
mkdir -p "$1"
fi
if [[ ! -d "$2" ]]; then
mkdir -p "$2"
fi
chown -R :100 "$1" "$2"
chmod 775 "$1" "$2"
mount --bind "$1" "$2"
}
# Remember permissions, you may have to fix them:
# chown -R :users /data/common
bindmount "/home/mike/upload" "/home/ms/mike"
bindmount "/home/aaron/upload" "/home/ms/aaron"
userlist.conf
ms:ms:1001:100
mike:mike:1002:100
aaron:aaron:1003:100
本來想用ln的方式去操作,
從terminal 能夠進去資料夾,但用FTP登入就是說 no such file or dirctory
問了老半天GPT也都是失敗,
從一開始說要加個不存在的參數 FollowSymlinks ,
到後面的一連串重複回答。
最後看到 Symbolic link and filezilla over sftp
看來是ln的先天限制,所以改用mount後,調個權限,好了。
ref.